﻿using System;
using System.Collections.Generic;
using System.Net;
using System.Net.Sockets;
using System.Linq;
using System.Text;
using System.Windows.Forms;

namespace Test2
{
    class URControlHandle
    {
        public Socket ClientSocket;//socket类型
        public IPAddress myIP;     //IP类
        public IPEndPoint ipe;     //节点类

        //创建只需要实例化这个socket即可，不需要连接
        public void Creat_client(string IP, int PORT)
        {
            //所有UR的控制都在这里完成，先生成一个ClientSocket
            ClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
            myIP = IPAddress.Parse(IP);//IP地址
            ipe = new IPEndPoint(myIP, PORT);//封装节点
            //一次连接终生使用
            try
            {
                ClientSocket.Connect(ipe);//socket连接
            }
            catch (Exception connectError)
            {
                MessageBox.Show(connectError.ToString());//连接失败时异常提示
            }
        }

        //因为连接是同步的方法，会导致阻塞，所以把连接功能放到与发送一起执行
        public void Send_command(string command)
        {
            command += "\r\n";//把换行添加到命令中
            byte[] buffersend = System.Text.Encoding.Default.GetBytes(command);//把命令转换成字节数组
            try
            {
                ClientSocket.Send(buffersend);//发送命令到服务器
            }
            catch
            {
                //MessageBox.Show(sendError.ToString());
                //这就是说明没有连接到UR(实际操作中，即便连接正常了，也会有这样的问题)
                //MessageBox.Show("未取得与UR的连接，请确认连接正常。");
            }
        }

        //前面发送的指令都是单向的，但是有的指令是请求UR提供返回值的
        public string Send_command_WithFeedback(string command)
        {
            command += "\r\n";//把换行添加到命令中
            byte[] buffersend = System.Text.Encoding.Default.GetBytes(command);//把命令转换成字节数组
            try
            {
                ClientSocket.Send(buffersend);//发送命令
            }
            catch (Exception sendError)//发送失败提示错误信息
            {
                MessageBox.Show(sendError.ToString());
            }
            //发送完了之后立即等待接收
            byte[] bytes = new byte[1024];//创建接收缓存空间
            string data = "";//定义字符串变量
            int bytesRec = ClientSocket.Receive(bytes);//等待返回接收到的数据长度，数据存储到bytes中（数据为字节类型）
            data += Encoding.ASCII.GetString(bytes, 0, bytesRec);//把接收到的数据字节类型转换成字符串
            return data;//返回字符串
        }

        //还有最极端的一种情况，我刚连接到Dashboard的时候，Dashboard会主动给我发送一条命令
        public string No_command_WaitFeedback()
        {
            byte[] bytes = new byte[1024];//创建缓存空间
            string data = "";//创建字符串变量
            int bytesRec = ClientSocket.Receive(bytes);//接收数据，并返回字节数据的长度
            data += Encoding.ASCII.GetString(bytes, 0, bytesRec);//把接收到的数据转换成字符串数据
            return data;//返回接收到的数据
        }

        //只有在点击退出按钮才关闭
        public void Close_client()
        {
            try
            {
                ClientSocket.Shutdown(SocketShutdown.Both);//进制接收和发送数据
                ClientSocket.Close();//关闭socket
            }
            catch
            {

            }
        }
    }
}
